#include <mips/regdef.h>
#include <sys/syscall.h>

//////////////// STACK ///////////////////////////////////////////////////
//-------------SRA--------------pos		reg			//
//								28		pad			//
//								24		ra			//
//								20		fp			//
//								16		gp			//
//-------------SRA----------------					//
//-------------ABA----------------					//
//								12					//
//								8					//
//								4					// # llama a count que tiene un argumento
//								0		a0			//
//-------------ABA----------------					//
//////////////////////////////////////////////////////////////////////////

#define SPACE_CHAR 32
#define NEWLINE_CHAR 10

# Constantes para que sea mas clara la ABI
#define STACK_SP 32
#define STACK_RA 24
#define STACK_FP 20
#define STACK_GP 16

# Variables globales y el tamanio en bytes de cada una
.extern characters, 4
.extern words, 4
.extern lines, 4

	.text
	.align 2
	.globl count # Dice que count es global
	.ent count

count:

	.frame $fp, STACK_SP, ra
	.set noreorder
	.cpload t9
	.set reorder

	# Preparo el frame stack.
	subu sp,sp, STACK_SP
	.cprestore STACK_GP
	sw $fp, STACK_FP(sp)
	sw ra,	STACK_RA(sp)
	move $fp, sp

	# Guardo argumentos en ABA de la funcion padre
	sw	a0,STACK_SP($fp)	# Pongo a0 en el ABA+0 de la funcion padre
	sw	a1,STACK_SP+4($fp)  # Pongo a1 en el ABA+4 de la funcionp padre

	# Cargo los argumentos en registros temporales
	lw	t0, STACK_SP($fp)	#t0<-actual
	lw	t1, STACK_SP+4($fp)	#t1<-last

versipalabra:
	# llamada a isSpace
	move a0,t0 # pongo actual en a0
	jal isSpace
	bne v0, 1, versisalto # si no es separador sigue

	# actual es separador, veo si last es separador
	
	# llamada a isSpace
	# pongo last en a0
	lw a0, STACK_SP+4($fp)
	jal isSpace
	beq v0, 1, versisalto # si no es separador suma palabra
	
sumarpalabra: # Incremento la variable global words
	lw t2, words
	addi t2, t2, 1
	sw	t2, words

versisalto:
	lw	t0, STACK_SP($fp)	#t0<-actual
	bne	t0, NEWLINE_CHAR, versieof # veo si actual=newline

sumarlinea:
	lw	t4, lines	# actual=newline, incremento la variable global lines
	addi	t4, t4, 1
	sw	t4, lines

versieof:
	blt t0,zero,fin # veo si actual=eof, si es menor que 0 es porque es eof

sumarcaracter:	 # No es eof, incremento la variable global characters
	lw	t3, characters
	addi	t3, t3, 1
	sw	t3, characters

fin: #Dejo el stack como estaba
	 move 	sp,$fp
	 lw	$fp, STACK_FP(sp)
	 lw ra, STACK_RA(sp)
	 addu	sp, sp, STACK_SP
     j ra	# Retorno

.end count
